package com.pawernode.config;

import lombok.Data;
import org.springframework.amqp.core.*;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * RabbitMQ配置类，用于声明交换机、队列和绑定关系
 */
@Configuration
@ConfigurationProperties(prefix = "my")
@Data
public class RabbitConfig {
    // 交换机名称
    private String exchangeName;
    // 队列A名称
    private String queueAName;
    // 队列B名称
    private String queueBName;

    /**
     * 创建一个headersExchange
     * @return HeadersExchange实例
     */
    @Bean
    public HeadersExchange headersExchange(){
        return ExchangeBuilder.headersExchange(exchangeName).build();
    }

    /**
     * 创建队列A
     * @return 队列A实例
     */
    @Bean
    public Queue queueA(){
        return QueueBuilder.durable(queueAName).build();
    }

    /**
     * 创建队列B
     * @return 队列B实例
     */
    @Bean
    public Queue queueB(){
        return QueueBuilder.durable(queueBName).build();
    }

    /**
     * 创建队列A的绑定关系，使用所有匹配的方式
     * @return Binding实例
     */
    @Bean
    public Binding bindingA(){
        Map<String, Object> headerValues = new HashMap<>();
        headerValues.put("type", "m");
        headerValues.put("status", "1");
        return BindingBuilder.bind(queueA()).to(headersExchange()).whereAll(headerValues).match();
    }

    /**
     * 创建队列B的绑定关系，使用任意匹配的方式
     * @return Binding实例
     */
    @Bean
    public Binding bindingB(){
        Map<String, Object> headerValues = new HashMap<>();
        headerValues.put("type", "s");
        headerValues.put("status", "0");
        return BindingBuilder.bind(queueB()).to(headersExchange()).whereAny(headerValues).match();
    }
}
